package com.enen.filter;

import com.enen.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.yaml.snakeyaml.scanner.Scanner;

import java.io.IOException;

@Slf4j
//@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class TokenFilter implements Filter {
    @Override //过滤器初始化方法
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 强转成 HttpServletRequest 和 HttpServletResponse
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 1. 获取请求的 URI
        String uri = request.getRequestURI();
        // 2. 判断 URI 是否包含/login 如果包含，放行
        if (uri.contains("/login")) {
            log.info("登录成功");
            filterChain.doFilter(request, response); // 放行
            return; //遇到return，则不再执行后续代码
        }

        // 3. 获取请求头中的 token
        String token = request.getHeader("token");

        // 4. 判断token是否存在，不存在，返回未登录状态码(401)
        if (token == null || token.isEmpty()) {
            response.setStatus(401);
            return;
        }
        // 5. 判断token是否正确，不正确，返回未登录状态码(401)
        try {
            // 调用 JwtUtils 的 parseToken 方法，传入 token
            JwtUtils.parseToken(token);
        } catch (Exception e) {
            // 如果解析失败，说明 token 不正确，返回未登录状态码(401)
            response.setStatus(401);
            return; // 遇到return，则不再执行后续代码
        }
        // 6. 放行
        log.info("用户已登录");
        filterChain.doFilter(request, response);
    }
}
